Python学习笔记3:用Python实现三国演义文本分析(人物出场次数及人物词云) | 您所在的位置:网站首页 › pyecharts 背景图 › Python学习笔记3:用Python实现三国演义文本分析(人物出场次数及人物词云) |
《三国演义》是我很喜欢看的一部经典名著,里面有各具特色的人物。那么人物的出场次数如何呢?现用Python来回答这个问题。 本文用Python对《三国演义》中人物出场次数进行了统计排序,并进行可视化展示,最后对小说人物进行了词云分析。 配套源代码及程序讲解。 人物出场次数可视化展示(极坐标图和柱状图): ![]() ![]() 人物词云: ![]() 大体思路是用jieba库进行分词,排除掉一些非人名词语。然后对人物频率进行统计排序。最后生成词云图。 1.分词#分词 import jieba txt=open("三国演义.txt",'r',encoding = 'UTF-8').read() words=jieba.lcut(txt) #精确模式分词,重点1 counts={} #创建字典,存放人名word和次数count for word in words: if len(word)==1: #排除一个字(非人名) continue #同人不同名合并 elif word == "诸葛亮" or word == "孔明曰": rword = "孔明" elif word == "关公" or word == "云长": rword = "关羽" elif word == "玄德" or word == "玄德曰": rword = "刘备" elif word == "孟德" or word == "丞相": rword = "曹操" else: rword=word counts[rword]=counts.get(rword,0)+1 #重点2 #排除非人名词语 with open('停用词库.txt', 'r', encoding='UTF-8') as meaninglessFile: stopwords = set(meaninglessFile.read().split('\n')) for word in stopwords: del(counts[word]) items=list(counts.items()) #将字典转换为列表 items.sort(key=lambda x:x[1],reverse=True) #重点3 num=13 #打印出场数前num的人名 for i in range(num): word,count=items[i] print("{0:3}".format(word,count))输出结果: 曹操 1428 孔明 1373 刘备 1222 关羽 779 张飞 348 吕布 300 孙权 264 赵云 255 司马懿 219 周瑜 217 袁绍 190 马超 185 魏延 177 讲解: 1.jieba库是Python的第三方中文分词库,安装方法: pip install jieba 对于英文来说,用split()方法即可。 2.counts[rword]=counts.get(rword,0)+1 counts.get(rword,0)方法表示:如果键rword在字典counts中,就返回rword对应的值;否则,返回0。 3.items.sort(key=lambda x:x[1],reverse=True) 按列表items的第二个字段的倒序重新排序。 4.运行程序的时候发现文件读取错误。 是因为编码的问题。解决方法一:新建txt文件,将原来文件复制进去,替换掉源文件,问题得到解决。解决方法二:txt=open("三国演义.txt", encoding='gb18030', errors='ignore').read() 改变编码方式,运行了一下也能解决问题。最终采用的是第一种方法。 5.这段代码主要分三步走: 获取文本文件,进行分词; 对每个词进行计数; 对单词频率排序。 2.人物出场次数进行数据存储和可视化#导出数据 fo = open("人物出场次数.txt", "a", encoding='utf-8') for i in range(num): word, count=items[i] word = str(word) count = str(count) fo.write(word) fo.write(':') #使用冒号分开 fo.write(count) fo.write('\n') #换行 fo.close() #关闭文件 #将txt文本里的数据转换为字典 fr = open('人物出场次数.txt', 'r',encoding='utf-8' ) dic = {} keys = [] # 用来存储读取的顺序 for line in fr: v = line.strip().split(':') dic[v[0]] = v[1] keys.append(v[0]) fr.close() print(dic) # 绘柱状图 from pyecharts.charts import Bar #从pyecharts库中导入Bar子类 list1=list(dic.keys()) #人物 list2=list(dic.values()) #出场次数 bar = Bar() #定义柱状图 bar.add_xaxis(list1) bar.add_yaxis("人物出场次数",list2,) bar.render("人物出场次数可视化图.html") #生成render.html文件 # 绘极坐标图 from pyecharts import options as opts #list1.sort(reverse=True) #list2.sort(reverse=True) polar = ( Polar() .add_schema( radiusaxis_opts=opts.RadiusAxisOpts(data=list1, type_="category"), ) .add("", list2, type_='bar') ) #polar.render_notebook() polar.render("人物出场次数极坐标图.html")讲解: 1.将出场次数排名前13的保存文件,并保存到dic的字典中。 2.strip()用于移除字符串头尾指定的字符(默认为空格或换行符)。 str.split(str="", num=string.count(str)) 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串。 3.知识点:字典dic中添加键值对的方法。 dic[v[0]] = v[1] 4.柱状图部分别以字典dic的键和值为横纵坐标进行画图。 5.安装了3个prechart库发现,只有prechart35这个能用。Prechart是Python强大的第三方可视化库,可以绘制很多酷炫的图像。 ![]() 讲解: 1.wordcloud是Python词云展示第三方库,以词语为基本单位,通过图形可视化的方式,可以更加直观和艺术的展示文本。 2.最常用的方法是用wc.generate(text)直接生成词云。 3.generate_from_frequencies(counts):已知词及其对应的词频,注意括号中为字典格式。 【参考】: [1] 嵩天.Python语言程序设计基础.高等教育出版社[M],2019. [2] Eric Mathes.Python编程从入门到实践.人民邮电出版社[M],2020. [3] Python之wordcloud库使用_jinsefm的博客-CSDN博客 [4] python三国演义人物 统计分析_使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。..._weixin_39734493的博客-CSDN博客 [5] Python爬虫爬取哈利波特小说,并用数据可视化分析出场人物 - 知乎 (zhihu.com) [6] python实现对小说的文本分析(人物关系图,人物词云等)_YouYang_Wang的博客-CSDN博客_python小说文本分析 [7] 使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。 - 这题必考 - 博客园 (cnblogs.com) |
CopyRight 2018-2019 实验室设备网 版权所有 |